home *** CD-ROM | disk | FTP | other *** search
/ Apple II Magazines (PO) / Bits and Bytes Volume 11, No. 05 (1989-11)(Apple Computing Enjoyment Society)(Side B).zip / Bits and Bytes Volume 11, No. 05 (1989-11)(Apple Computing Enjoyment Society)(Side B).po / PROGRAMS / WORD.SEARCH.bas < prev   
BASIC Source File  |  1996-12-24  |  9KB  |  245 lines

  1. 1  REM  *************************
  2. 2  REM  * PUBLIC DOMAIN SOFTWARE*
  3. 3  REM  *     MODIFIED BY       *
  4. 6  REM  *    YOU MAY LEGALLY    *
  5. 7  REM  *   COPY THIS PROGRAM   *
  6. 8  REM  *************************
  7. 10  TEXT : HOME 
  8. 15  PRINT  TAB( 8);"CHALLENGER DISK 1 SIDE 2"
  9. 20  PRINT "THIS PROGRAM IS A WORD SEARCH PUZZLE"
  10. 30  PRINT "GENERATOR!! IN THE COURSE OF MAKING THE PUZZLE"
  11. 40  PRINT "THE MACHINE MAY FIND THAT IT CAN'T PUT A"
  12. 50  PRINT "PARTICULAR WORD ANYWHERE AND SO WILL "
  13. 60  PRINT "ASK YOU IF IT SHOULD START THE WHOLE"
  14. 70  PRINT "PUZZLE OVER.  IF YOU DON'T WANT TO START"
  15. 80  PRINT "OVER, TYPING 'NO' WILL THROW AWAY THAT"
  16. 90  PRINT "PARTICULAR WORD.  IF THIS PERSISTS,"
  17. 100  PRINT "TRY EITHER GIVING FEWER WORDS OR BIGGER"
  18. 110  PRINT "PUZZLE DIMENSIONS!"
  19. 120  PRINT 
  20. 130  PRINT "BE SURE CAPS LOCK IS DOWN!
  21. 140  PRINT 
  22. 150  DEF  FN A(Z) =  INT( RND(1) *Z +1)
  23. 160  PRINT : PRINT 
  24. 170  PRINT "WILL YOUR PRINTER PRINT 80 CHARACTERS"
  25. 180  PRINT "ACROSS (Y/N)? Y"
  26. 190  VTAB 21: HTAB 15: GET TW$
  27. 200  PRINT : IF TW$ = "y"  THEN TW = 80: PRINT : GOTO 260
  28. 210  IF TW$ = "Y"  THEN TW = 80: PRINT : GOTO 260
  29. 220  IF TW$ =  CHR$(13)  THEN TW = 80: PRINT : GOTO 260
  30. 230  PRINT 
  31. 240  INPUT "HOW MANY COLUMNS DOES YOUR PRINTER HAVE?";TW
  32. 250  PRINT 
  33. 260  PRINT "DO YOU WANT A SOLUTION PRINTED OUT?  ";: GET X$: PRINT X$
  34. 270  IF  LEFT$(X$,1) = "Y"  THEN  PRINT : PRINT : GOTO 310
  35. 280  IF  LEFT$(X$,1) = "N"  THEN  PRINT : PRINT : GOTO 310
  36. 290  PRINT 
  37. 300  GOTO 260
  38. 310  PRINT "WHAT IS THE WIDTH OF THE PUZZLE?"
  39. 320  PRINT "(2 TO "; INT(TW/2);")  ";: INPUT "";W:MD = W
  40. 330  IF W *2 < = TW  THEN 350
  41. 340  PRINT "THAT WILL NOT FIT IN ";TW;" COLUMNS.": GOTO 310
  42. 350  IF W <2  THEN 310
  43. 360  PRINT 
  44. 370  INPUT "THE LENGTH (2 TO 60)?   ";L: IF L >W  THEN MD = L
  45. 380  IF L <2  THEN 370
  46. 385  IF L >60  THEN  PRINT : PRINT "THAT WILL NOT FIT ON ONE PAGE.": PRINT : PRINT "REENTER ";: GOTO 370
  47. 390  PRINT 
  48. 400  INPUT "WHAT IS THE MAXIMUM NUMBER OF WORDS     IN THE PUZZLE?   ";M
  49. 420  IF M > = 2  THEN 440
  50. 430  PRINT "SORRY, THERE MUST BE AT LEAST 2 WORDS": GOTO 400
  51. 440  PRINT 
  52. 450  DIM A$(L,W),W$(M)
  53. 460  DIM W(M,3),DXY(8,2),DD(28)
  54. 470  PRINT "NOW ENTER A HEADING THAT WILL BE PRINTED OVER THE PUZZLE"
  55. 480  PRINT "(";TW;" CHARACTERS MAXIMUM!)"
  56. 490  INPUT XY$
  57. 500  GOSUB 3000
  58. 510  PRINT "OK...ENTER A WORD AT EACH QUESTION MARK"
  59. 520  PRINT "TO REDO A WORD TYPE A HYPHEN(-)"
  60. 530  PRINT "TO FINISH EARLY TYPE A PERIOD(.)"
  61. 540  PRINT 
  62. 550  FOR I = 1 TO M
  63. 560  INPUT T$: IF T$ = "-"  THEN I = I -1: PRINT "REDO ";W$(I);"...": GOTO 560
  64. 570  IF T$ = "."  THEN M = I -1: GOTO 790
  65. 580  IF  LEN(T$) = 0  THEN  PRINT "INPUT ERROR. PLEASE REENTER...": GOTO 560
  66. 590 J = 1
  67. 600 TE$ =  MID$ (T$,J,1): IF TE$ > = "A"  AND TE$ < = "Z"  THEN 670
  68. 610  IF TE$ <"A"  OR TE$ >"Z"  THEN 630
  69. 620  MID$ (T$,J,1) =  CHR$( ASC( MID$ (T$,J,1)) +32: GOTO 670
  70. 630  IF TE$ = T$  THEN T$ = "": GOTO 580
  71. 640  IF J =  LEN(T$)  THEN T$ =  LEFT$(T$,J -1): GOTO 680
  72. 650  IF J = 1  THEN T$ =  RIGHT$(T$, LEN(T$) -1):J = J -1: GOTO 670
  73. 660 T$ =  LEFT$(T$,J -1) + RIGHT$(T$, LEN(T$) -J):J = J -1
  74. 670 J = J +1: IF J < =  LEN(T$)  THEN 600
  75. 680  PRINT "-";T$;"-"
  76. 690  IF  LEN(T$) < = MD  THEN 720
  77. 700  PRINT "THAT'S TOO LONG. ";
  78. 710  PRINT " TRY ANOTHER ONE.": GOTO 560
  79. 720  FOR IZ = 1 TO I -1: IF W$(IZ) < >T$  THEN  NEXT : GOTO 740
  80. 730  PRINT "YOU ENTERED THAT ONE ALREADY.TRY ANOTHER": GOTO 560
  81. 740 W$(I) = T$
  82. 750  NEXT I
  83. 760  PRINT 
  84. 770  PRINT "THAT'S IT...";M;" WORDS"
  85. 780  PRINT 
  86. 790  PRINT "NOW LET ME PONDER THIS...."
  87. 800  PRINT 
  88. 810  FOR I = 1 TO M -1
  89. 820  FOR J = I +1 TO M
  90. 830  IF  LEN(W$(I)) < LEN(W$(J))  THEN HZ$ = W$(I):W$(I) = W$(J):W$(J) = HZ$
  91. 840  NEXT : NEXT 
  92. 850  FOR I = 1 TO 8: READ DXY(I,1),DXY(I,2): NEXT 
  93. 870  DATA  0,1,1,1,1,0,1,-1,0,-1,-1,-1,-1,0,-1,1
  94. 880  ON Z GOSUB 2000,2050,2100,2150,2200,2250,2300,2350,2400,2450,2500,2550,2675,2600
  95. 890  FOR I = 1 TO M
  96. 900 LN =  LEN(W$(I))
  97. 910 NT = 0
  98. 920 SD = DD( FN A(28))
  99. 930 SX =  FN A(W):X1 = SX +(LN -1) *DXY(SD,1): IF X1 <1  OR X1 >W  THEN 920
  100. 940 SY =  FN A(L):X1 = SY +(LN -1) *DXY(SD,2): IF X1 <1  OR X1 >L  THEN 920
  101. 950 NT = NT +1: IF NT < >W *L *2  THEN 1010
  102. 960  PRINT "COULDN'T FIT '";W$(I);"' IN THE PUZZLE"
  103. 970  INPUT "DO YOU WISH ME TO START OVER?  ";A$
  104. 980  PRINT 
  105. 990  IF  LEFT$(A$,1) = "Y"  THEN 890
  106. 1000 W$(I) = "": GOTO 1090
  107. 1010 J = SY:K = SX
  108. 1020  FOR P = 1 TO LN
  109. 1030  IF  LEN(A$(J,K))  AND A$(J,K) < > MID$ (W$(I),P,1)  THEN 920
  110. 1040 J = J +DXY(SD,2):K = K +DXY(SD,1): NEXT P
  111. 1050 J = SY:K = SX
  112. 1060  FOR P = 1 TO LN:A$(J,K) =  MID$ (W$(I),P,1)
  113. 1070 J = J +DXY(SD,2):K = K +DXY(SD,1): NEXT 
  114. 1080 W(I,1) = SX:W(I,2) = SY:W(I,3) = SD
  115. 1090  NEXT I
  116. 1100  FOR I = 1 TO L
  117. 1110  FOR J = 1 TO W
  118. 1120  IF A$(I,J) = ""  THEN A$(I,J) =  CHR$( FN A(26) +64)
  119. 1130  NEXT : NEXT 
  120. 1140  FOR I = 1 TO M -1: FOR J = I +1 TO M
  121. 1150  IF W$(I) < = W$(J)  THEN 1180
  122. 1160 HZ$ = W$(I):W$(I) = W$(J):W$(J) = HZ$
  123. 1170  FOR K = 1 TO 3:HZ = W(I,K):W(I,K) = W(J,K):W(J,K) = HZ: NEXT K
  124. 1180  NEXT J: NEXT I
  125. 1190  PRINT 
  126. 1200  INPUT "HOW MANY COPIES OF THIS PUZZLE WOULD    YOU LIKE?  ";N
  127. 1220  IF N >4  THEN  PRINT : PRINT "THAT'S TOO MANY. MAKE 1-4 COPIES THEN": PRINT "USE THE OFFICE'S DUPLICATION.": PRINT : GOTO 1200
  128. 1225  PRINT 
  129. 1230  PRINT "FOR EACH COPY REQUESTED, PRESS RETURN"
  130. 1240  PRINT "TO BEGIN PRINTING...."
  131. 1250  PRINT 
  132. 1260  FOR C = 1 TO N: GOSUB 1270: NEXT : GOTO 1450
  133. 1270  PRINT : PRINT "BE SURE THE PRINTER IS TURNED ON..."
  134. 1280  INPUT A$: PR# 1
  135. 1290 T = (TW -2 *W)/2 +1: PRINT " "
  136. 1300  PRINT " "
  137. 1310  PRINT  TAB( (TW - LEN(XY$))/2 +1);XY$
  138. 1320  PRINT " ": PRINT " "
  139. 1330  FOR J = 1 TO L: PRINT  TAB( T);
  140. 1340  FOR K = 1 TO W: IF A$(J,K) = "."  THEN  PRINT ". ";: GOTO 1360
  141. 1350  PRINT  CHR$( ASC(A$(J,K)));" ";
  142. 1360  NEXT : PRINT " ": NEXT 
  143. 1370  PRINT " ": PRINT " "
  144. 1380  PRINT "FIND THESE HIDDEN WORDS IN THE PUZZLE"
  145. 1390  PRINT " "
  146. 1400  FOR J = 1 TO M: IF  LEN(W$(J)) = 0  THEN 1430
  147. 1410  IF  POS(0) + LEN(W$(J)) >TW -2  THEN  PRINT " "
  148. 1420  PRINT W$(J)
  149. 1430  NEXT : FOR X = 1 TO 4: PRINT " ": NEXT 
  150. 1440  RETURN 
  151. 1450  IF  LEFT$(X$,1) = "Y"  THEN 1470
  152. 1460  IF  LEFT$(X$,1) = "N"  THEN  PR# 0: GOTO 1610
  153. 1470  REM 
  154. 1480  FOR I = 1 TO L: FOR J = 1 TO W:A$(I,J) = ".": NEXT J: NEXT I
  155. 1490  FOR I = 1 TO M
  156. 1500 LN =  LEN(W$(I)):J = W(I,2):K = W(I,1)
  157. 1510  FOR P = 1 TO LN
  158. 1520 A$(J,K) =  MID$ (W$(I),P,1)
  159. 1530 J = J +DXY(W(I,3),2):K = K +DXY(W(I,3),1): NEXT P
  160. 1540  NEXT I
  161. 1550  PR# 0
  162. 1560  PRINT "ADJUST YOUR PAPER IF NECESSARY AND THEN"
  163. 1570  PRINT "PRESS RETURN TO PRINT OUT THE ANSWER KEY";
  164. 1580  INPUT A$: PR# 1
  165. 1590 XY$ = "HERE IS THE ANSWER KEY:"
  166. 1600  GOSUB 1290
  167. 1610  PR# 0: PRINT : PRINT 
  168. 1620  PRINT "WOULD YOU LIKE ANOTHER WORD SEARCH?  ";: GET Z$
  169. 1630  IF  LEFT$(Z$,1) = "Y"  THEN  RUN 
  170. 1640  IF  LEFT$(Z$,1) = "N"  THEN  END 
  171. 1650  PRINT : GOTO 1620
  172. 2000  REM  HORIZONTAL LEFT TO RIGHT ONLY
  173. 2010  FOR I = 1 TO 28:DD(I) = 3: NEXT 
  174. 2020  RETURN 
  175. 2050  REM  TOP TO BOTTOM ONLY
  176. 2060  FOR I = 1 TO 28:DD(I) = 1: NEXT 
  177. 2070  RETURN 
  178. 2100  REM  HORIZONTAL, BUT BACKWARDS
  179. 2110  FOR I = 1 TO 28:DD(I) = 7: NEXT 
  180. 2120  RETURN 
  181. 2150  REM  VERTICAL, BUT BACKWARDS
  182. 2160  FOR I = 1 TO 28:DD(I) = 5: NEXT 
  183. 2170  RETURN 
  184. 2200  REM  TOP TO BOTTOM AND LEFT TO RIGHT
  185. 2210  FOR I = 1 TO 27  STEP 2
  186. 2220 DD(I) = 1:DD(I +1) = 3: NEXT 
  187. 2230  RETURN 
  188. 2250  REM  COMBINATION OF 1 THRU 4
  189. 2260  FOR I = 1 TO 25  STEP 4
  190. 2270 DD(I) = 1:DD(I +1) = 3:DD(I +2) = 5:DD(I +3) = 7: NEXT 
  191. 2280  RETURN 
  192. 2300  REM  DIAGONALLY DECENDING LEFT TO RIGHT
  193. 2310  FOR I = 1 TO 28:DD(I) = 2: NEXT 
  194. 2320  RETURN 
  195. 2350  REM  DIAGONALLY ASCENDING LEFT TO RIGHT
  196. 2360  FOR I = 1 TO 28:DD(I) = 4: NEXT 
  197. 2370  RETURN 
  198. 2400  REM  DIAGONALLY ASCENDING RIGHT TO LEFT
  199. 2410  FOR I = 1 TO 28:DD(I) = 6: NEXT 
  200. 2420  RETURN 
  201. 2450  REM  DIAGONALLY DESCENDING RIGHT TO LEFT
  202. 2460  FOR I = 1 TO 28:DD(I) = 8: NEXT 
  203. 2470  RETURN 
  204. 2500  REM  DIAGONALLY LEFT TO RIGHT ASCENDING AND DESCENDING
  205. 2510  FOR I = 1 TO 27  STEP 2
  206. 2520 DD(I) = 2:DD(I +1) = 4: NEXT 
  207. 2530  RETURN 
  208. 2550  REM  ALL DIAGONALS
  209. 2560  FOR I = 1 TO 25  STEP 4
  210. 2570 DD(I) = 2:DD(I +1) = 4:DD(I +2) = 6:DD(I +3) = 8: NEXT 
  211. 2580  RETURN 
  212. 2600  REM  ALL DIRECTIONS
  213. 2610  FOR I = 1 TO 17  STEP 8
  214. 2620  FOR J = 0 TO 7
  215. 2630 DD(I +J) = J +1
  216. 2640  NEXT J: NEXT I
  217. 2650  FOR Q = 25 TO 27  STEP 2
  218. 2660 DD(Q) = 1:DD(Q +1) = 3: NEXT 
  219. 2670  RETURN 
  220. 2675  REM  COMBINATION OF 5, 7, AND 8
  221. 2680  FOR I = 1 TO 25  STEP 4
  222. 2685 DD(I) = 1:DD(I +1) = 2:DD(I +2) = 3:DD(I +3) = 4: NEXT 
  223. 2690  RETURN 
  224. 3000  REM : SELECT WORD ARRANGEMENT
  225. 3010  HOME 
  226. 3020  PRINT "SELECT THE ARRANGEMENT OF THE WORDS:": PRINT 
  227. 3030  PRINT 
  228. 3040  PRINT " 1> LEFT TO RIGHT ONLY (HORIZONTAL)
  229. 3050  PRINT " 2> TOP TO BOTTOM ONLY (VERTICAL)
  230. 3060  PRINT " 3> HORIZONTAL, BUT BACKWARDS"
  231. 3070  PRINT " 4> VERTICAL, BUT BACKWARDS"
  232. 3080  PRINT " 5> HORIZONTAL AND VERTICAL"
  233. 3090  PRINT " 6> A COMBINATION OF 1> THRU 4>"
  234. 3100  PRINT " 7> DIAGONALLY DESCENDING LEFT TO RIGHT"
  235. 3110  PRINT " 8> DIAGONALLY ASCENDING LEFT TO RIGHT"
  236. 3120  PRINT " 9> DIAGONALLY ASCENDING RIGHT TO LEFT"
  237. 3130  PRINT "10> DIAGONALLY DESCENDING RIGHT TO LEFT"
  238. 3140  PRINT "11> A COMBINATION OF 7> AND 8>"
  239. 3150  PRINT "12> ALL DIAGONAL COMBINATIONS
  240. 3155  PRINT "13> A COMBINATION OF 5>, 7> AND 8>
  241. 3160  PRINT "14> ALL DIRECTIONS"
  242. 3170  PRINT : PRINT : PRINT 
  243. 3180  INPUT "YOUR CHOICE.....";Z
  244. 3190  IF Z <1  OR Z >14  THEN 3180
  245. 3200  HOME : RETURN